iT邦幫忙

0

Day28 | 遊戲開發(七)

  • 分享至 

  • xImage
  •  

先前做了水平判定,今天要來做垂直判定和對角線判定。


Part 1.垂直判定

  • checkWinner() 垂直方向檢查
    繼水平檢查之後,我們需要用類似的邏輯來檢查直行(Column 0~2)。透過外層迴圈遍歷每一行,並比對該行的三個格子是否被同一位玩家佔領:
// 垂直方向檢查 (Vertical)
for (int c = 0; c < 3; c++){
    // 效能優化:如果該行的第一格是空的,代表這行不可能連線,直接跳過
    if (board[0][c].getText() == "") continue;

    // 檢查該行的第一格、第二格與第三格內容是否完全相同
    if (board[0][c].getText() == board[1][c].getText() && 
        board[1][c].getText() == board[2][c].getText()){
        
        // 若垂直連線成立,遍歷該行的 3 個按鈕並套用獲勝高亮
        for (int i = 0; i < 3; i++){
            setWinner(board[i][c]);
        }
        gameOver = true; // 鎖定遊戲狀態
        return;
    }
}

說明:

1. 矩陣座標思考的轉換:
* 在水平檢查中,外層迴圈控制的是列(Row),內層固定行。
* 而在垂直檢查中,外層迴圈改為控制行(Column)c,並在內部比對固定行的三個不同列(board[0][c]、board[1][c]、board[2][c])。

2. 陣列索引邊界(Index Out Of Bounds)小提醒:
* 寫程式時要特別注意,因為 3x3 陣列的索引範圍是 0 到 2,千萬不要不小心寫成 board[3][c],否則執行時會吃下紅字報錯!

3. 共用setWinner():
* 因為我們在上一篇就把變色與宣告獲勝者的邏輯封裝成 setWinner() 函式,這裡只要直接呼叫它,就能無縫套用亮綠色字體與灰色高亮背景,程式碼非常乾淨俐落(Clean Code)。
  • 跑出來長這樣:
    https://ithelp.ithome.com.tw/upload/images/20261018/20184397wncIvG4NKM.png

Part 2.對角線判定

  • 主對角線檢查(左上到右下)
    主對角線指的是座標 (0,0)、(1,1) 到 (2,2) 的這條斜線。我們透過判斷這三格的文字是否相同,且開頭不能是空白來進行判定:
// 主對角線檢查 (Diagonally)
if (board[0][0].getText() == board[1][1].getText() && 
    board[1][1].getText() == board[2][2].getText() && 
    board[0][0].getText() != "") {
    
    // 若連線成立,透過迴圈將對角線的三個按鈕套用勝利高亮
    for (int i = 0; i < 3; i++){
        setWinner(board[i][i]);
    }
    gameOver = true;
    return;
}
  • 反對角線檢查(右上到左下)
    反對角線則是從右上角的 (0,2) 經過中心 (1,1) 到左下角的 (2,0)。除了用相同的邏輯比對文字外,我們還可以逐個呼叫 setWinner() 來點亮這三顆按鈕:
// 反對角線檢查 (Anti-diagonally)
if (board[0][2].getText() == board[1][1].getText() && 
    board[1][1].getText() == board[2][0].getText() &&
    board[0][2].getText() != "") {
    
    // 依序對反對角線的三個按鈕套用高亮特效
    setWinner(board[0][2]);
    setWinner(board[1][1]);
    setWinner(board[2][0]);
    
    gameOver = true;
    return;
}

說明:

1. 防呆檢查 != "" 的重要性:
在比對對角線時,因為遊戲剛開始棋盤全部都是空白(""),如果不加上 board[0][0].getText() != "" 的限制,遊戲一開場就會誤判「全都是空白等於連線」而直接宣告勝利!因此確保格子「不是空的」是斜線檢查的關鍵防呆。

2. 複用 setWinner():
不管是哪一種連線方式,只要一經確認,我們都能立刻呼叫共用的 setWinner() 方法,將字體轉為亮綠色、背景轉為灰色,並在頂端標題精準秀出贏家宣告。
  • 跑出來長這樣:
    https://ithelp.ithome.com.tw/upload/images/20261018/20184397M1exYZ4aYL.png
    https://ithelp.ithome.com.tw/upload/images/20261018/20184397IX1ypnG9g5.png

  • 參考教學影片:https://youtu.be/Nc77ymnm8Ss?si=8hG1DdqmX_lk7frl


*提醒邦友,使用第三方服務/API 時,請務必評估資安風險與隱私保護
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言